package com.shujia.service.impl;

import com.shujia.bean.Dept;
import com.shujia.dao.CacheDao;
import com.shujia.service.CacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class CacheServiceImpl implements CacheService {

    @Autowired
    CacheDao cacheDao;

    /**
     * 开启Redis缓存，需要注意在Redis服务中，
     *      不能开启集群模式(可以通过ps -ef | grep redis查看)
     *      如果开启
     *          1.可以在redis.conf文件中将 cluster-enabled yes 设置为 no
     *          2.修改配置文件中的 cluster-config-file 为 nodes-6379.conf
     *          3.删除/usr/local/soft/redis-6.2.1中的 nodes-6380.conf 文件
     * @param deptNo
     * @return
     */
    @Override
    /**
     * 在第二次调用时，Redis中已经存在缓存数据了，
     *      当代码执行到getDataByDeptNo方法前的Cacheable注解时，会去Redis中寻找具体的Key对应的Value是否存在
     *      如果存在，那么直接将Value返回，而不会执行getDataByDeptNo中的代码块
     *
     * 注意：
     *      key = "'deptNo'" 表示Key为一个固定值 deptNo
     *      key = "#deptNo"  表示Key为getDataByDeptNo方法对应的参数
     */
    @Cacheable(value = "cache",key = "#deptNo")
    public String getDataByDeptNo(int deptNo) {
        System.out.println("service中的getDataByDeptNo被调用..");
        return cacheDao.getDeptByDeptNo(deptNo);
    }

    @Override
    // 该注解表示清除缓存，其中key="#dept.deptNo" 表示获取对象中的部门编号
    @CacheEvict(value="cache",key="#dept.deptNo")
    public void updateDept(Dept dept) {
        cacheDao.updateDept(dept);
    }
}
